
#include "merge.h"

// ���20������վ
char bus[5][20][50] = {
    {"������·��վ", "����Τ����վ", "�츮�㳡վ"},
    {"���·��վ", "������Ϭ����վ", "�츮�㳡վ"},
    {"����·��վ", "��ɳ�����վ", "������վ"},
    {"��ҵ·վ", "�ɶ���վ", "��ҽ��ʡҽԺվ", "���վ", "���Ӵ������·��վ"},
    {"���·����·��վ", "�彭��·վ", "����վ", "��ƽ��վ"}};

void p_code(c32 d[], int len, char *s) {
    p();
    printf("%s\r\n", s);
    for (int i = 0; i < len; i++) {
        printf("%d\r\n", d[i]);
    }

    p();
}

void display(char *title, char *content, char *footer) {
    OLED_clear_screen();
    c32 d[100] = {0};
    //============
    int len = OLED_str_to_str(d, 100, title, 100);
    // p_code(d, len, title);
    OLED_draw_text(0, 0, d, len);

    //=======
    len = OLED_str_to_str(d, 100, content, 100);
    // p_code(d, len, content);
    OLED_draw_text(16, 0, d, len);
    //=============
    len = OLED_str_to_str(d, 100, footer, 100);
    // p_code(d, len, footer);
    OLED_draw_text(32, 0, d, len);

    delay_s(3);
}

int get_bus_no() {

    p_str("����������Ĺ���·��:");

    display("��ʾ", "����ѡ�񹫽�", "������");

    int no = 0;
    scanf("%d", &no);
    printf("����ѡ�񹫽�·��:%d·\r\n", no);

    char buf[100] = {0};
    sprintf(buf, "%d·", no);
    display("��ʾ", "��ѡ�񹫽�·��", buf);

    return no;
}

bool get_bus_direction() {
    p_str("����������ķ���:");
    p_str("0.����");
    p_str("1.����");
    int b = 0;
    scanf("%d", &b);

    printf("����ѡ����:%d%s\r\n", b, b ? "����" : "����");
    return b;
}

int get_bus_start_station(int idx) {
    p_str("��������ʼվ:");
    display("��ʾ", "����ѡ����ʼվ", "������");
    for (int j = 0; j < 20; j++) {
        // ��������û��վ���ˣ�����
        if (bus[idx][j][0] == 0) {
            break;
        }
        printf("%d.%s\r\n", j, bus[idx][j]);
    }
    int sidx = -1;
    scanf("%d", &sidx);
    printf("����ѡ����ʼվ:%d %s\r\n", sidx, bus[idx][sidx]);

    display("��ʾ", bus[idx][sidx], "��ѡ��");
    return sidx;
}

int get_bus_stop_station(int idx) {
    p_str("�������յ�վ:");
    display("��ʾ", "����ѡ���յ�վ", "������");
    for (int j = 0; j < 20; j++) {
        // ��������û��վ���ˣ�����
        if (bus[idx][j][0] == 0) {
            break;
        }
        printf("%d.%s\r\n", j, bus[idx][j]);
    }
    int sidx = -1;
    scanf("%d", &sidx);
    printf("����ѡ���յ�վ:%d %s\r\n", sidx, bus[idx][sidx]);
    display("��ʾ", bus[idx][sidx], "��ѡ��");
    return sidx;
}

int bus_no_to_idx(int no) {
    switch (no) {
    case 1:
        return 0;
    case 28:
        return 1;
    case 103:
        return 2;
    case 55:
        return 3;
    case 66:
        return 4;
    }
    return -1;
}

void print_bus_guide() {
    p_str("��������վϵͳ");
    p_str("�����¹���·��,��ѡ������Ĺ���:");
    p_str("--1·:");
    p_str("--28·:");
    p_str("--103·:");
    p_str("--55·:");
    p_str("--66·:");
}

void start_bus_run(int bus_idx, int station_idx, int arr_station_idx) {
    char (*stations)[50] = bus[bus_idx];
    printf("��ǰվ:%s\r\n", stations[station_idx]);
    display("��ǰ����վ", stations[station_idx], "���ϳ�");
    delay_s(10);
    if (arr_station_idx > station_idx) {

        for (int i = station_idx + 1; i <= arr_station_idx; i++) {

            printf("��һվ:%s\r\n", stations[i]);
            display("��һվ", stations[i], "��ע�⵽վ����");
            delay_s(next_rand_limit_max(20));

            printf("�Ѿ���վ:%s\r\n", stations[i]);
            display("�ѵ�վ", stations[i], "���³�");
            delay_s(3);
            // ��վ���ѣ��� 3 s
            TIM2_BZ_turn_on(true);
            delay_s(3);
            TIM2_BZ_turn_on(false);
        }
    } else if (arr_station_idx < station_idx) {

        for (int i = station_idx - 1; i >= arr_station_idx; i--) {

            printf("��һվ:%s\r\n", stations[i]);
            display("��һվ", stations[i], "��ע�⵽վ����");
            delay_s(next_rand_limit_max(20));

            printf("�Ѿ���վ:%s\r\n", stations[i]);

            display("�ѵ�վ", stations[i], "���³�");
            delay_s(3);

            // ��վ���ѣ��� 3 s
            TIM2_BZ_turn_on(true);
            delay_s(3);
            TIM2_BZ_turn_on(false);
        }
    } else {
        printf("��ʼվ���յ�վ��ͬ�����³�\r\n");
        display("��ʾ", "��ʼվ���յ�վ", "��ͬ");
        delay_s(10);
    }
}

void bus_system_run() {

    print_bus_guide();

    printf("\r\n");

    int no = get_bus_no();

    printf("\r\n");
    int idx = bus_no_to_idx(no);

    printf("\r\n");
    if (idx == -1) {
        p_str("û�иù���������ѡ");
        char buf[100] = {0};
        sprintf(buf, "û�й���%d·", no);
        display("����", buf, "����������");
        return;
    }
    int sidx = get_bus_start_station(idx);
    printf("\r\n");

    int eidx = get_bus_stop_station(idx);
    printf("\r\n");

    // bool dir = get_bus_direction();

    start_bus_run(idx, sidx, eidx);
    printf("\r\n");
}

void print_char_code() {
    char chs[] = "�츮�㳡������Ϭ����Ա��ɶ���������Τ�������ɳ�����������"
                 "���ۿ��彭��ƽ��";
    for (int i = 0; chs[i]; i++) {

        if (i % 2 == 0) {
            printf("%#x", chs[i]);
        } else {
            printf("%x,%d,", chs[i], 93 + i + 1);
        }
    }
    printf("\r\n");
}

void wait() {
    while (true)
        ;
}

int main() {

    printf_init(9600);
    delay_init();

    // no source ming 2-5k
    // 4k
    TIM2_PWM1_init(18, 1000);

    // �ȴ������ʼ�����
    delay_s(10);
    // OLED��ʼ��
    OLED_init();
    // ����OLED
    OLED_clear();
    // p();
    // c32 d[100] = {0};
    // int len = OLED_str_to_str(d, "����");
    // OLED_draw_text(0, 0, d, len);
    // p();
    // OLED_draw_tiger();
    // p();
    // wait();
    while (true) {
        // delay_s(3);
        // print_char_code();
        delay_s(3);
        bus_system_run();
        // printf("main running\r\n");
        // delay_s(3);
        // printf("random %d\r\n", next_rand_limit_max(100));
        // delay_s(3);
    }

    return 0;
}
